Lua 不是一种面向对象的编程语言,而是一种利用 C 函数和类似 C 语法的脚本语言。 但是,您可以在 Lua 代码中使用一个很酷的技巧,使 Lua 在您需要时表现得像面向对象的语言。 关键在于 Lua 的表结构,本文演示了如何使用 Lua 表来代替面向对象的类。
什么是面向对象编程?
术语“面向对象”本质上是一种描述模板系统的花哨方式。 想象一下,您正在编程一个应用程序,以帮助用户在僵尸末日期间发现和记录僵尸。 您正在使用面向对象的语言,例如 C ++,Java或Python。 您需要创建代码对象来表示不同类型的僵尸,以便用户可以将它们拖动并放置在城市地图上。 当然,僵尸可以是任何事物:休眠的,慢速的,快速的,饥饿的,贪婪的等等。 这只是文本数据,计算机擅长跟踪,并且基于该数据,您甚至可以为虚拟“对象”分配一个图形,以便用户可以识别每个小部件代表的僵尸的大致类型。
对于如何解决应用程序的此需求,您有几种选择
-
强迫您的用户学习如何编写代码,以便他们可以将自己的僵尸编程到您的应用程序中
-
花费您余生的时间将每种可能的僵尸编程到您的应用程序中
-
使用代码模板定义僵尸对象的属性,允许您的用户根据他们实际发现的僵尸来创建他们需要的项目
显然,唯一现实的选择是最后一个,它使用一种称为类的编程构造来完成。 这是一个类的外观(此示例恰好是 Java 代码,但是概念在所有面向对象的语言中都是相同的)
public class Zombie {
int height;
int weight;
String speed;
String location;
}
无论您是否理解代码,您可能都可以看出这本质上是一个模板。 它声明,当创建一个虚拟“对象”来表示僵尸时,编程语言将为该对象分配四个属性(两个整数分别代表身高和体重,两个单词分别代表移动速度和物理位置)。 当用户单击(假想的)应用程序中的 添加项目 按钮时,该类将用作模板(在编程中,他们说“已创建一个新实例”),以分配用户输入的值。 只需一个类,就可以拥有无限的僵尸。 这是面向对象编程的力量之一。
Lua 表
在 Lua 中,表是一种实现关联数组的数据类型。 您可以将 Lua 中的表视为数据库。 这是一个索引信息的存储库,您可以使用特殊的语法来调用它。 这是一个非常简单的例子
example = {}
example.greeting = "hello"
example.space = " "
example.subject = "world"
print(example.greeting ..
example.space ..
example.subject)
运行示例代码以查看结果
$ lua ./example.lua
hello world
从示例代码可以看出,表本质上是一堆保存在单个集合(“表”)中的键和值。
Lua 元表
元表是一个充当表模板的表。 您可以将任何表指定为元表,然后像对待其他语言中的类一样对待它。
这是一个定义僵尸的元表
Zombie = {}
function Zombie.init(h,w,s,l)
local self = setmetatable({}, Zombie)
self.height = h
self.weight = w
self.speed = s
self.location = l
return self
end
-- use the metatable
function setup()
z1 = Zombie.init(176,50,'slow','Forbes & Murray Avenue')
end
function run()
print(z1.location .. ": " ..
z1.height .. " cm, " .. z1.weight .. " kg, " .. z1.speed)
end
setup()
run()
为了将我的元表与普通表区分开,我将元表名称的第一个字母大写。 这不是必需的,但我发现这是一个有用的约定。
这是示例代码的结果
$ lua ./zombie.lua
Forbes & Murray Avenue: 176 cm, 50 kg, slow
此演示并不能完全体现元表的优势,因为示例代码仅创建了一个没有用户交互的对象。 为了使用元表来解决仅从一个元表创建无限项的问题,您将改为编写一个用户输入函数(使用 Lua 的 io.read()
函数)来要求用户提供他们发现的僵尸的详细信息。 您甚至可能会编写一个带有“新发现”按钮的用户界面,或者类似的东西。 但是,这超出了本文的范围,只会使示例代码复杂化。
创建元表
要记住的重要一点是,要创建元表,请使用以下语法
Example = {}
function Example.init(args)
local self = setmetatable({}, Example)
self.key = value
return self
end
使用元表
要使用已创建的元表,请使用以下语法
my_instance = Example.init("required args")
面向对象的 Lua
Lua 不是面向对象的,但是它的表机制使处理,跟踪和排序数据变得尽可能简单。 毫不夸张地说,一旦您熟悉 Lua 中的表,您就可以自信地说,您至少了解了该语言的一半。 您可以将表(以及扩展名,元表)用作数组,映射,便捷的变量组织,足够接近的类等等。
评论已关闭。